﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using SIGERP_Entidades;
using System.Data;

namespace SIGERP_Datos
{
    public class HndClientes
    {
        public static List<Cliente> getAll()
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT * FROM dbo.cliente" + " ORDER BY apellido");
            var clientes = new List<Cliente>();
            foreach (DataRow dtRow in tabla.Rows)
            {
                Cliente c = new Cliente(dtRow);
                c.tipodocumento = HndTiposDocumento.getOne(Convert.ToInt32(dtRow["id_tipo_documento"]));
                c.estado_civil = HndEstadosCiviles.getOne(Convert.ToInt32(dtRow["id_estado_civil"]));
                c.nacionalidad = HndPaises.GetOne(Convert.ToInt32(dtRow["id_nacionalidad"]));
                c.ciudad = HndCiudades.GetOne(Convert.ToInt32(dtRow["id_ciudad"]));
                clientes.Add(c);
            }
            return clientes;
        }

        public static List<Cliente> devolverClientesHabilitados()
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT * FROM dbo.cliente where habilitado=1" + " ORDER BY apellido");
            var clientes = new List<Cliente>();
            foreach (DataRow dtRow in tabla.Rows)
            {
                Cliente c = new Cliente(dtRow);
                c.tipodocumento = HndTiposDocumento.getOne(Convert.ToInt32(dtRow["id_tipo_documento"]));
                c.estado_civil = HndEstadosCiviles.getOne(Convert.ToInt32(dtRow["id_estado_civil"]));
                c.nacionalidad = HndPaises.GetOne(Convert.ToInt32(dtRow["id_nacionalidad"]));
                c.ciudad = HndCiudades.GetOne(Convert.ToInt32(dtRow["id_ciudad"]));
                clientes.Add(c);
            }
            return clientes;
        }

        public static Cliente getOne(int id)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT TOP 1 * FROM dbo.cliente WHERE codigo_cliente=" + id + " ORDER BY apellido");
            DataRow dtRow = tabla.Rows[0];
            Cliente c = new Cliente(dtRow);
            c.tipodocumento = HndTiposDocumento.getOne(Convert.ToInt32(dtRow["id_tipo_documento"]));
            c.estado_civil = HndEstadosCiviles.getOne(Convert.ToInt32(dtRow["id_estado_civil"]));
            c.nacionalidad = HndPaises.GetOne(Convert.ToInt32(dtRow["id_nacionalidad"]));
            c.ciudad = HndCiudades.GetOne(Convert.ToInt32(dtRow["id_ciudad"]));
            return c;
        }

        public static void insert(Cliente cliente)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "INSERT INTO dbo.cliente (apellido,nombre,sexo,id_tipo_documento,numero_documento,fecha_nacimiento,telefono,celular,email,id_estado_civil,id_nacionalidad,calle,numero,piso,departamento,id_ciudad,habilitado) VALUES (@apellido,@nombre,@sexo,@id_tipo_documento,@numero_documento,@fecha_nacimiento,@telefono,@celular,@email,@id_estado_civil,@id_nacionalidad,@calle,@numero,@piso,@departamento,@id_ciudad,1)";
            comando.Parameters.AddWithValue("@apellido", cliente.apellido);
            comando.Parameters.AddWithValue("@nombre", cliente.nombre);
            comando.Parameters.AddWithValue("@sexo", cliente.sexo);
            comando.Parameters.AddWithValue("@id_tipo_documento", cliente.tipodocumento.id_tipo_documento);
            comando.Parameters.AddWithValue("@numero_documento", cliente.numero_documento);
            if(cliente.fecha_nacimiento!=null) comando.Parameters.AddWithValue("@fecha_nacimiento", cliente.fecha_nacimiento);
            else comando.Parameters.AddWithValue("@fecha_nacimiento", DBNull.Value);
            comando.Parameters.AddWithValue("@telefono", cliente.telefono);
            comando.Parameters.AddWithValue("@celular", cliente.celular);
            comando.Parameters.AddWithValue("@email", cliente.email);
            comando.Parameters.AddWithValue("@id_estado_civil", cliente.estado_civil.id_estado_civil);
            comando.Parameters.AddWithValue("@id_nacionalidad", cliente.nacionalidad.id);
            comando.Parameters.AddWithValue("@calle", cliente.calle);
            comando.Parameters.AddWithValue("@numero", cliente.numero);
            comando.Parameters.AddWithValue("@piso", cliente.piso);
            comando.Parameters.AddWithValue("@departamento", cliente.departamento);
            comando.Parameters.AddWithValue("@id_ciudad", cliente.ciudad.id);
            Conexion.ejecutaComando(comando);
        }

        public static void update(Cliente cliente)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "UPDATE dbo.cliente SET apellido=@apellido,nombre=@nombre,sexo=@sexo,id_tipo_documento=@id_tipo_documento,numero_documento=@numero_documento,fecha_nacimiento=@fecha_nacimiento,telefono=@telefono,celular=@celular,email=@email,id_estado_civil=@id_estado_civil,id_nacionalidad=@id_nacionalidad,calle=@calle,numero=@numero,piso=@piso,departamento=@departamento,id_ciudad=@id_ciudad, habilitado=@habilitado WHERE codigo_cliente=@id";

            comando.Parameters.AddWithValue("@id", cliente.cod_cliente);
            comando.Parameters.AddWithValue("@apellido", cliente.apellido);
            comando.Parameters.AddWithValue("@nombre", cliente.nombre);
            comando.Parameters.AddWithValue("@sexo", cliente.sexo);
            comando.Parameters.AddWithValue("@id_tipo_documento", cliente.tipodocumento.id_tipo_documento);
            comando.Parameters.AddWithValue("@numero_documento", cliente.numero_documento);
            if (cliente.fecha_nacimiento != null) comando.Parameters.AddWithValue("@fecha_nacimiento", cliente.fecha_nacimiento);
            else comando.Parameters.AddWithValue("@fecha_nacimiento", DBNull.Value);
            comando.Parameters.AddWithValue("@telefono", cliente.telefono);
            comando.Parameters.AddWithValue("@celular", cliente.celular);
            comando.Parameters.AddWithValue("@email", cliente.email);
            comando.Parameters.AddWithValue("@id_estado_civil", cliente.estado_civil.id_estado_civil);
            comando.Parameters.AddWithValue("@id_nacionalidad", cliente.nacionalidad.id);
            comando.Parameters.AddWithValue("@calle", cliente.calle);
            comando.Parameters.AddWithValue("@numero", cliente.numero);
            comando.Parameters.AddWithValue("@piso", cliente.piso);
            comando.Parameters.AddWithValue("@departamento", cliente.departamento);
            if (cliente.habilitado) comando.Parameters.AddWithValue("@habilitado", 1);
            else comando.Parameters.AddWithValue("@habilitado", 0);
            comando.Parameters.AddWithValue("@id_ciudad", cliente.ciudad.id);
            Conexion.ejecutaComando(comando);
        }

        public static void delete(Cliente cliente)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "DELETE FROM dbo.cliente WHERE codigo_cliente=@codigo_cliente";
            comando.Parameters.AddWithValue("@codigo_cliente", cliente.cod_cliente);
            Conexion.ejecutaComando(comando);
        }

        public static bool verificarSiExiste(Cliente c)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.cliente WHERE id_tipo_documento='" + c.tipodocumento.id_tipo_documento + "' and numero_documento= " + c.numero_documento);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;

        }

        public static bool hayReclamosAsociados(Cliente c)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.reclamo WHERE cod_cliente=" + c.cod_cliente);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;
        }

        public static Boolean disable(Cliente c)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "UPDATE dbo.cliente SET habilitado=0 WHERE codigo_cliente=@id";
            comando.Parameters.AddWithValue("@id", c.cod_cliente);

            return Conexion.ejecutaComando(comando);
        }

        public static Cliente obtenerClienteConDocumento(int tipodocumento, string numerodocumento, string sex) 
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT TOP 1 * FROM dbo.cliente WHERE id_tipo_documento=" + tipodocumento + " and numero_documento='" + numerodocumento + "' and sexo='" + sex +"'");
            DataRow dtRow = tabla.Rows[0];
            Cliente c = new Cliente(dtRow);
            c.tipodocumento = HndTiposDocumento.getOne(Convert.ToInt32(dtRow["id_tipo_documento"]));
            c.estado_civil = HndEstadosCiviles.getOne(Convert.ToInt32(dtRow["id_estado_civil"]));
            c.nacionalidad = HndPaises.GetOne(Convert.ToInt32(dtRow["id_nacionalidad"]));
            c.ciudad = HndCiudades.GetOne(Convert.ToInt32(dtRow["id_ciudad"]));
            return c;
        }

        public static Cliente obtenerClienteConDocumento(int tipodocumento, string numerodocumento)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT TOP 1 * FROM dbo.cliente WHERE id_tipo_documento=" + tipodocumento + " and numero_documento='" + numerodocumento +"'");
            DataRow dtRow = tabla.Rows[0];
            Cliente c = new Cliente(dtRow);
            c.tipodocumento = HndTiposDocumento.getOne(Convert.ToInt32(dtRow["id_tipo_documento"]));
            c.estado_civil = HndEstadosCiviles.getOne(Convert.ToInt32(dtRow["id_estado_civil"]));
            c.nacionalidad = HndPaises.GetOne(Convert.ToInt32(dtRow["id_nacionalidad"]));
            c.ciudad = HndCiudades.GetOne(Convert.ToInt32(dtRow["id_ciudad"]));
            return c;
        }
    }
}
